#ifndef LOGGER__TIMER_H_
#define LOGGER__TIMER_H_

#include <time.h>
#include <sys/time.h>

// Necesarios para Timer.h
#include <util/Thread.h>                  // Shared-lib
#include <util/WaitCondition.h>           // Shared-lib
#include "vigilance/runnable/DemoTypes.h"
using namespace varayoc::vigilance::util;


namespace varayoc
{

   namespace vigilance
   {

      namespace util
      {

         class Timer: public Thread
         {

         public:

            /// \brief Metodo estatico que crea una instancia a la clase Timer.
            ///
            /// \return Retorna un puntero inteligente a Timer.
            static Timer_ptr create();

            /// \brief Destructor de la clase Timer.
            ///
            /// \return No hay valor de retorno.
            virtual ~Timer();

            /// \brief Inicio del Timer.
            ///
            /// \return No hay valor de retorno.
            Void startTimer();

            /// \brief Verificacion del Timer.
            ///
            /// \return Retorna Verdadero si ... de lo contrario Falso.
            Bool checkTimer();

            /// \brief Termino del Timer.
            ///
            /// \return No hay valor de retorno.
            Void stopTimer();

            /// \brief  Setea el valor del intervalo en milisegundos.
            ///
            /// \return No hay valor de retorno.
            inline Void setInterval(UInt interval ///<    : Variable que almacena el valor del intervalo en milisegundos.
                                    );

            /// \brief Obtiene el valor de la configuracion en milisegundos.
            ///
            /// \return Retorna el valor de la configuracion en milisegundos.
            inline UInt getInterval();

         private:

            UInt m_interval; ///< Variable que almacena el valor de intervalo de tiempo en milisegundos.
            Bool m_isStart; ///< Variable que indica True si el timer fue inicializado sino False.
            Bool m_checkOut; ///< indica si ya se supero el tiempo de intervalo
            WaitCondition m_intervalBeatWait;

            /// \brief Constructor de la clase Timer.
            ///
            /// \return No hay valor de retorno.
            Timer();

            /// \brief Constructor copia de la clase.
            ///
            /// \return No hay valor de retorno.
            Timer(const Timer& timer); ///<    : Referencia a un objeto Timer.

            /// \brief Sobrecarga de operador de asignacion.
            ///
            /// \return Retorna una referencia a un objeto Timer.
            Timer & operator=(const Timer& timer); ///<    : Referencia a un objeto Timer.

            virtual UInt32 run();

         };

         Void Timer::setInterval(UInt interval)
         {
            m_interval = interval;
         }

         UInt Timer::getInterval()
         {
            return m_interval;
         }

      }

   }

}
#endif /* LOGGER__TIMER_H_ */

